package gruppe5.dame.client.gui.game;

import gruppe5.dame.client.Chat;
import gruppe5.dame.client.Hauptfenster;
import gruppe5.dame.model.Pawn;
import gruppe5.dame.model.types.PawnColor;
import gruppe5.dame.model.types.PawnDirection;
import gruppe5.dame.server.rfc.objects.cGameMove;
import gruppe5.dame.server.rfc.objects.cPackageHeader;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * Haupt-UI-Element des Spiels Dame
 * 
 * @author kramerse
 * 
 */
public class DameGUI extends JPanel {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 6680930033276876791L;
	
	/**
	 * UI Element Spielfeld
	 */
	private Spielfeld feld;
	
	/**
	 * UI Element buttons
	 */
	private Buttonpanel buttons;
	
	/**
	 * UI Element Spielinfo
	 */
	private Spielinfo info;
	
	/**
	 * UI Element Chat
	 */
	private Chat chat;
	
	/**
	 * Hauptfenster
	 */
	private Hauptfenster frame;
	
	/**
	 * Netzwerkkommunikation f&uuml;r das Spiel Dame
	 */
	private NetzwerkDame netzwerk;
	
	/**
	 * Die Spielfeldgroesse.
	 * 8, 10 oder 12.
	 */
	private int gridSize = 8;

	/**
	 * Die Farbe der Spielfiguren.
	 * BLACK oder WHITE.
	 */
	private PawnColor playerColor;

	/**
	 * Konstuktor
	 * 
	 * @param frame
	 */
	public DameGUI(Hauptfenster frame) {
		this.frame = frame;
		netzwerk = new NetzwerkDame(frame.getSocket(), this);
		feld = new Spielfeld(this);
		buttons = new Buttonpanel(this);
		info = new Spielinfo(this);
		this.setLayout(new BorderLayout());
		chat = this.frame.getChat();
		chat.setPreferredSize(new Dimension(250, 1));
		JPanel panel1 = new JPanel();
		panel1.setLayout(new GridLayout(2, 1));
		panel1.add(info);
		panel1.add(chat);
		JPanel panel2 = new JPanel();
		panel2.setLayout(new BorderLayout());
		panel2.add(feld, BorderLayout.CENTER);
		panel2.add(buttons, BorderLayout.SOUTH);
		this.add(panel1, BorderLayout.EAST);
		this.add(panel2, BorderLayout.CENTER);
	}

	/**
	 * Spieler will Spiel verlassen
	 */
	public void spielVerlassen() {
		Object[] options = { "Ja", "Nein" };
		int var = JOptionPane.showOptionDialog(this,
				"Willst du das Spiel verlassen?", "Spiel verlassen",
				JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE,
				null, options, options[1]);
		if (var == 0) {
			netzwerk.spielVerlassen();
		}
	}

	/**
	 * Spieler will Spiel aufgeben
	 */
	public void spielAufgeben() {
		Object[] options = { "Ja", "Nein" };
		int var = JOptionPane.showOptionDialog(this,
				"Willst du das Spiel aufgeben?", "Spiel aufgeben",
				JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE,
				null, options, options[1]);
		if (var == 0) {
			netzwerk.spielAufgeben();
		}
	}

	/**
	 * Spieler will Unetschieden anbieten
	 */
	public void unentschiedenAnbieten() {
		buttons.toggleButtonAnbieten();
		netzwerk.unentschiedenAnbieten();
	}

	/**
	 * Spieler will Unentschieden annehmen
	 */
	public void unentschiedenAnnehmen() {
		Object[] options = { "Ja", "Nein" };
		int var = JOptionPane.showOptionDialog(this,
				"Willst du Unentschieden annehmen?", "Unentschieden annehmen",
				JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE,
				null, options, options[1]);
		if (var == 0) {
			netzwerk.unentschiedenAnnehmen();
		}
	}

	/**
	 * Spieler wird Unentschieden angeboten
	 * Informationsnachricht, Spieler muss sich nicht gleich entscheiden
	 */
	public void unentschiedenEmpfangen() {
		buttons.enableButtonannehmen(true);
		JOptionPane.showMessageDialog(this,
				"Dir wurde ein Unentschieden angeboten", "Unentschieden",
				JOptionPane.INFORMATION_MESSAGE);
	}

	/**
	 * Spieler zieht Unentschieden Angbot zur&uuml;ck.
	 */
	public void unentschiedenZurucknehmen() {
		buttons.toggleButtonAnbieten();
		netzwerk.unentschiedenZurucknehmen();
	}

	/**
	 * Spieler will Chat Nachricht senden
	 * 
	 * @param text
	 */
	public void chatSenden(String text) {
		frame.sendChatMessage(text);
	}

	/**
	 * Chat Nachricht vom Server empfangen
	 */
	public void chatEmpfangen(String text) {
		chat.addText(text);
	}

	/**
	 * Spielfeld setzen
	 * @param feld2
	 */
	public void setSpielfeld(Pawn[][] par) {
		feld.updateSteine();
	}

//	/**
//	 * get model
//	 * @return model
//	 */
//	public DameModel getModel() {
//		return frame.getModel();
//	}

	/**
	 * Spieler nimmt Unentschieden an
	 */
	public void unentschiedenAngenommen() {
		// TODO unentschiedenAngenommen() Kommt der Spieler gleich in die Lobby zuruek?
	}

	/**
	 * Spieler lehnt Unentschieden ab
	 */
	public void unentschiedenAbgelehnt() {
		// TODO unentschiedenAbgelehnt() Buttons aendern und Nachricht?
	}

	/**
	 * Spieler betritt Lobby
	 */
	public void enterLobby() {
		frame.enterLobby();
		
	}

	/**
	 * Spielz&uuml;ge als Text darstellen
	 */
	public void spielzuegeAlsText() {
		// TODO Spiezuege als Text darstellen
		
	}

	public void movePawn(int id, PawnDirection wunschRichtung) {
//		netzwerk.movePawn(id, wunschRichtung);
		frame.get_RFC().Client_SendPackage(new cGameMove(cPackageHeader.PackageType.GameMove, id, wunschRichtung));
	}
	
	public void setGridSize(int _gridSize) { this.gridSize = _gridSize; }
	public int getGridSize() { return this.gridSize; }
	
	public void setPlayerColor(PawnColor _playerColor) 
	{ 
		this.playerColor = _playerColor; 
		this.info.add(new JLabel(this.playerColor.toString()));
	}
	
	public PawnColor getPlayerColor() { return this.playerColor; }
	
	public void updateSpielfeld(Pawn[] pawns)
	{
		feld.updateSteine(pawns);
	}

}